unit Scrn;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, 
  Controls,Forms, Dialogs, ExtCtrls;

type
  TScrnFrm = class(TForm)
    tmrTick: TTimer;
    procedure tmrTickTimer(Sender: TObject);

    procedure FormShow(Sender: TObject);
    procedure FormHide(Sender: TObject);
    procedure FormActivate(Sender: TObject);

  private
    { Private declarations }
    procedure DrawSphere(x, y, size : integer; 
                                             color : TColor);

    procedure DeactivateScrnSaver(var Msg : TMsg; 
                                             var Handled : boolean);
  public
    { Public declarations }
  end;

var
  ScrnFrm: TScrnFrm;
  hwn    : HWND;

implementation
uses  Cfg;

{$R *.DFM}


var
  crs : TPoint; 

function Min(a, b : integer) : integer;
begin
  if b < a then
    Result := b
  else
    Result := a;
end; {Min}


procedure TScrnFrm.DrawSphere(x, y, size : integer;
                                                             color : TColor);
var
  i, dw    : integer;
  cx, cy   : integer;
  xy1, xy2 : integer;
  r, g, b  : byte;
begin
  with Canvas do begin
    Pen.Style := psClear;
    Brush.Style := bsSolid;
    Brush.Color := color;

    r := GetRValue(color);
    g := GetGValue(color);
    b := GetBValue(color);

    dw := size div 16;

    for i := 0 to 15 do begin
      xy1 := (i * dw) div 2;
      xy2 := size - xy1;
      Brush.Color := RGB(Min(r + (i * 8), 255), 
                                           Min(g + (i * 8), 255),
                                           Min(b + (i * 8), 255));
      Ellipse(x + xy1, y + xy1, x + xy2, y + xy2);
    end;
  end;
end; {TScrnFrm.DrawSphere}

procedure TScrnFrm.DeactivateScrnSaver(var Msg : TMsg;
                                                              var Handled : boolean);
var
  done : boolean;
  S:String;
begin
  if Msg.message = WM_MOUSEMOVE then
    done := (Abs(LOWORD(Msg.lParam) - crs.x) > 5) or
                  (Abs(HIWORD(Msg.lParam) - crs.y) > 5)
  else
    done := (Msg.message = WM_KEYDOWN)         or 
                  (Msg.message = WM_KEYUP)             or
                  (Msg.message = WM_SYSKEYDOWN)   or 
                  (Msg.message = WM_SYSKEYUP)       or
                  (Msg.message = WM_ACTIVATE)       or 
                  (Msg.message = WM_NCACTIVATE)   or
                  (Msg.message = WM_ACTIVATEAPP) or
                  (Msg.message = WM_LBUTTONDOWN) or
                  (Msg.message = WM_RBUTTONDOWN) or
                  (Msg.message = WM_MBUTTONDOWN);

  if done then begin
      InputQuery('Screen saver password','password',S);
  end;
  
  if done then Close;

end; {TScrnFrm.DeactivateScrnSaver}

procedure TScrnFrm.tmrTickTimer(Sender: TObject);
const
  sphcount : integer = 0;
var
  x, y    : integer;
  size    : integer;
  r, g, b : byte;
  color   : TColor;
begin
  if sphcount > CfgFrm.spnSpheres.Value then 
  begin
    Refresh;
    sphcount := 0;
  end;
  
 Inc(sphcount);
  x := Random(ClientWidth);
  y := Random(ClientHeight);
  size := CfgFrm.spnSize.Value + Random(50) - 25;
  x := x - size div 2;
  y := y - size div 2;
  r := Random($80);
  g := Random($80);
  b := Random($80);
  DrawSphere(x, y, size, RGB(r, g, b));
end; {TScrnFrm.tmrTickTimer}

procedure TScrnFrm.FormShow(Sender: TObject);
begin
  ShowWindow(Application.handle,SW_HIDE);
  GetCursorPos(crs);
  tmrTick.Interval:= 1000  - 
                                             CfgFrm.spnSpeed.Value * 90;
  tmrTick.Enabled       := true;

  if UpperCase(Pchar(ParamStr(1)))='/P' then 
   begin
     hwn:=StrToInt(ParamStr(2));
     Windows.SetParent(handle,hwn);
   end
   else Application.OnMessage := DeactivateScrnSaver;

  ShowCursor(false);
end; {TScrnFrm.FormShow}

procedure TScrnFrm.FormHide(Sender: TObject);
begin
   Application.OnMessage := nil;
   tmrTick.Enabled       := false;
  ShowCursor(true);
end; {TScrnFrm.FormHide}

procedure TScrnFrm.FormActivate(Sender: TObject);
begin
  WindowState := wsMaximized;
end; {TScrnFrm.FormActivate}

end.
